package com.shm.leetcode;

import java.util.Arrays;

/**
 * 724. 寻找数组的中心索引
 * 给你一个整数数组 nums，请编写一个能够返回数组 “中心索引” 的方法。
 *
 * 数组 中心索引 是数组的一个索引，其左侧所有元素相加的和等于右侧所有元素相加的和。
 *
 * 如果数组不存在中心索引，返回 -1 。如果数组有多个中心索引，应该返回最靠近左边的那一个。
 *
 * 注意：中心索引可能出现在数组的两端。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1, 7, 3, 6, 5, 6]
 * 输出：3
 * 解释：
 * 索引 3 (nums[3] = 6) 的左侧数之和 (1 + 7 + 3 = 11)，与右侧数之和 (5 + 6 = 11) 相等。
 * 同时, 3 也是第一个符合要求的中心索引。
 * 示例 2：
 *
 * 输入：nums = [1, 2, 3]
 * 输出：-1
 * 解释：
 * 数组中不存在满足此条件的中心索引。
 * 示例 3：
 *
 * 输入：nums = [2, 1, -1]
 * 输出：0
 * 解释：
 * 索引 0 左侧不存在元素，视作和为 0 ；右侧数之和为 1 + (-1) = 0 ，二者相等。
 * 示例 4：
 *
 * 输入：nums = [0, 0, 0, 0, 1]
 * 输出：4
 * 解释：
 * 索引 4 左侧数之和为 0 ；右侧不存在元素，视作和为 0 ，二者相等。
 *
 *
 * 提示：
 *
 * nums 的长度范围为 [0, 10000]。
 * 任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。
 * @author SHM
 */
public class PivotIndex {
    public int pivotIndex(int[] nums) {
        int n = nums.length;
        int[] sum = new int[n+2];
        if(n==0||nums==null){
            return -1;
        }
        sum[0] = 0;
        for(int i=0;i<n;i++){
            sum[i+1] = sum[i]+nums[i];
        }
        sum[n+1] = sum[n];
        for(int i=1;i<=n;i++){
            if(sum[i-1]==sum[n+1]-sum[i]){
                return i-1;
            }
        }

        return -1;
    }

    /**
     * 方法一：前缀和
     * 思路
     *
     * 记数组的全部元素之和为 \textit{total}total，当遍历到第 ii 个元素时，设其左侧元素之和为 \textit{sum}sum，则其右侧元素之和为 \textit{total}-\textit{nums}_i-\textit{sum}total−nums
     * i
     * ​
     *  −sum。左右侧元素相等即为 \textit{sum}=\textit{total}-\textit{nums}_i-\textit{sum}sum=total−nums
     * i
     * ​
     *  −sum，即 2\times\textit{sum}+\textit{nums}_i=\textit{total}2×sum+nums
     * i
     * ​
     *  =total。
     *
     * 当中心索引左侧或右侧没有元素时，即为零个项相加，这在数学上称作「空和」（\text{empty sum}empty sum）。在程序设计中我们约定「空和是零」。
     *
     * 复杂度分析
     *
     * 时间复杂度：O(n)O(n)，其中 nn 为数组的长度。
     *
     * 空间复杂度：O(1)O(1)。
     * 作者：LeetCode-Solution
     * 链接：https://leetcode-cn.com/problems/find-pivot-index/solution/xun-zhao-shu-zu-de-zhong-xin-suo-yin-by-gzjle/
     * @param nums
     * @return
     */
    public int pivotIndex_2(int[] nums) {
        int total = Arrays.stream(nums).sum();
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            if(2*sum+nums[i]==total){
                return i;
            }
            sum+=nums[i];
        }
        return -1;
    }
}
